home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / P8_0101.HAS < prev    next >
Text File  |  1996-11-18  |  4KB  |  139 lines

  1. *=======================================================
  2. *
  3. *    8bitPCM 15.6kHz変換
  4. *
  5. *=======================================================
  6.  
  7. PCM8_0104:
  8. PCM8_0103:
  9. PCM8_0102:
  10. PCM8_0203:
  11. PCM8_0101:
  12.         move.w        CH_VOL(a5),d5        * d5.w = PCM VOLUME
  13.  
  14.         tst.b        CH_KEY_STAT(a5)        * keyon=$01 keyoff=$80 non=$00
  15.         bmi        PCM8_0101_keyoff
  16.         bne        PCM8_0101_keyon
  17.  
  18. *        通常の処理
  19.         movea.l        CH_PCM_ADR(a5),a0    * a0.l = PCMアドレス
  20.         movea.l        CH_TRAP_ADR(a5),a3    * a3.l = トラップアドレス
  21.         movea.l        CH_TRAP_ROUTINE(a5),a4    * a4.l = トラップ時の処理ルーチン
  22.  
  23.         movea.l        CH_JMP_ADR2(a5),a6
  24.         jmp        (a6)
  25.  
  26. *        キーオンの処理
  27. PCM8_0101_keyon:
  28.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  29.  
  30.         clr.w        CH_PITCH_CTR(a5)    * d4.l = 音程カウンタ
  31.         movea.l        CH_TOP_ADR(a5),a0    * a0.l = PCM先頭アドレス
  32.  
  33.         move.l        CH_LPTIME(a5),d7    * ループ処理があるか?
  34.         moveq.l        #1,d1
  35.         cmp.l        d1,d7            * cmpi.l より4clk 速い
  36.         beq        1f
  37.         move.l        d7,CH_LPTIME_CTR(a5)    * ループ回数カウンタ初期化
  38.         movea.l        CH_LPEND_ADR(a5),a3    * a3.l = ループ終了アドレス
  39.         lea.l        PCM8_LPEND,a4        * a4.l = ループ終了処理アドレス
  40.         move.l        a3,CH_TRAP_ADR(a5)
  41.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  42.  
  43.         movea.l        CH_JMP_ADR2(a5),a6
  44.         jmp        (a6)
  45.  
  46. 1:        movea.l        CH_END_ADR(a5),a3    * a3.l = 16bit PCMデータ終了アドレス
  47.         lea.l        PCM8_END,a4        * a4.l = データ終了処理アドレス
  48.         move.l        a3,CH_TRAP_ADR(a5)
  49.         move.l        a4,CH_TRAP_ROUTINE(a5)    * トラップ情報ををワークに保存
  50.  
  51.         movea.l        CH_JMP_ADR2(a5),a6
  52.         jmp        (a6)
  53.  
  54. *        キーオフの処理
  55. PCM8_0101_keyoff:
  56.         clr.b        CH_KEY_STAT(a5)        * KEY 状態リセット
  57.         clr.b        CH_PLAY_FLAG(a5)    * 演奏終了
  58.         jmp        make_keyoff_PCM        * 消音PCM展開
  59.  
  60. *=======================================================
  61.  
  62. PCM8_0101_mac    macro        _vol
  63.  
  64.         moveq.l        #MIX_SIZE*2-1,d6    * 48 * 2 = 96 <= 127 で moveq OK
  65.         add.l        a0,d6
  66.         cmp.l        a3,d6
  67.         bcs        @f            * 今回の処理中にはトラップしない
  68.  
  69.         * トラップ判定付きの変換
  70.         moveq.l        #MIX_SIZE*2-1-1,d6
  71. 2:        cmpa.l        a3,a0            * トラップアドレス判定
  72.         bcs        1f
  73.         jsr        (a4)            * トラップ!
  74. 1:        move.b        (a0)+,d0        * PCMデータ取り込み
  75.         ext.w        d0            * 符号拡張
  76.         VOLUME        _vol,d0,d2
  77.         add.w        d0,(a1)+
  78.         dbra        d6,2b
  79.  
  80. *        ラストの1回
  81.         cmpa.l        a3,a0
  82.         bcs        1f
  83.         jsr        (a4)            * トラップ!
  84. 1:        move.b        (a0)+,d0        * PCMデータ取り込み
  85.         ext.w        d0            * 符号拡張
  86.         move.w        d0,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d0.w
  87.         VOLUME        _vol,d0,d2
  88.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  89.         add.w        d0,(a1)+
  90.  
  91.         move.l        a0,CH_PCM_ADR(a5)    * PCMアドレス = a0.l
  92.  
  93.         rts
  94.  
  95.  
  96.         * トラップ無しの変換
  97.  
  98. @@:        moveq.l        #MIX_SIZE*2-1-1,d6
  99. 2:        move.b        (a0)+,d0        * PCMデータ取り込み
  100.         ext.w        d0            * 符号拡張
  101.         VOLUME        _vol,d0,d2
  102.         add.w        d0,(a1)+
  103.         dbra        d6,2b
  104.  
  105. *        ラストの1回
  106.         move.b        (a0)+,d0        * PCMデータ取り込み
  107.         ext.w        d0            * 符号拡張
  108.         move.w        d0,CH_LAST_PCM(a5)    * 前回変換終了時のPCM値 = d0.w
  109.         VOLUME        _vol,d0,d2
  110.         move.w        d0,CH_LAST_VPCM(a5)    * 最後のPCM値(音量変換後)
  111.         add.w        d0,(a1)+
  112.  
  113.         move.l        a0,CH_PCM_ADR(a5)    * PCMアドレス = a0.l
  114.  
  115.         rts
  116.  
  117.         endm
  118.  
  119. *=======================================================
  120.  
  121. PCM8_0101_v00:    PCM8_0101_mac    0
  122. PCM8_0101_v01:    PCM8_0101_mac    1
  123. PCM8_0101_v02:    PCM8_0101_mac    2
  124. PCM8_0101_v03:    PCM8_0101_mac    3
  125. PCM8_0101_v04:    PCM8_0101_mac    4
  126. PCM8_0101_v05:    PCM8_0101_mac    5
  127. PCM8_0101_v06:    PCM8_0101_mac    6
  128. PCM8_0101_v07:    PCM8_0101_mac    7
  129. PCM8_0101_v08:    PCM8_0101_mac    8
  130. PCM8_0101_v09:    PCM8_0101_mac    9
  131. PCM8_0101_v10:    PCM8_0101_mac    10
  132. PCM8_0101_v11:    PCM8_0101_mac    11
  133. PCM8_0101_v12:    PCM8_0101_mac    12
  134. PCM8_0101_v13:    PCM8_0101_mac    13
  135. PCM8_0101_v14:    PCM8_0101_mac    14
  136. PCM8_0101_v15:    PCM8_0101_mac    15
  137. PCM8_0101_vnn:    PCM8_0101_mac    'n'
  138. PCM8_0101_non:    PCM8_0101_mac    'x'
  139.